package it.pir.es06ChatRMIPull;
/*
 * Tale implementazione � la tipologia Pull e in questo caso il client richiede periodicamente al server se c'� qualche messaggio
 * che non ha ricevuto. Per evitare che il server invii tutta la lista dei messaggi ogni volta, ogni singolo msg � identificato da un 
 * id. Il client mantiene in locale l'ultimo id associato all'ultimo msg ricevuto e questo valore viene aggiornato ogni volta che viene effettuata
 * la richiesta di nuovi messaggi.
 */
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.util.List;

public class Client implements Runnable {
	
	private static final int SLEEP = 1000;
	private Chat server;
	
	public Client(Chat server){
		this.server=server;
	}
	
	public static void main(String args[]) throws NotBoundException, IOException{
		String address;
		
		address=args[0];
		String user = args[1];
		
		//Creo un puntatore ad un oggetto server remoto. In questo caso Chat � l'interfaccia.
		Chat server;
		
		//Prelevo l'indirizzo remoto del server contattando l'rmiregistry
		server=(Chat)Naming.lookup("rmi://"+address+"/chat");
		
		/*Creo un oggetto client e viene passato alla classe Thread
		 * Decido di lasciare ad un thread l'esecuzione del ciclo per la continua richiesta di messaggi al server. Inserisco tali
		 * istruzioni quindi nel metodo run().
		 */
		Client client = new Client(server);
		Thread t = new Thread(client);
		t.start();
		
		//Nel thread associato al main invece chiamiamo il metodo invia che prende in ingresso l'user passato per linea di comando
		 
		client.invia(user);
	}
	
	public void invia(String user) throws IOException{
		String text;
		
		//Lettura dallo stream di input da tastiera "System.in" 
		InputStreamReader in = new InputStreamReader(System.in);
		
		//Per leggere dallo stream creiamo un buffer
		BufferedReader bIn = new BufferedReader(in);
		
		while(true){
			text = bIn.readLine();
			Message m = new Message(text, user);
			
			//Prendo il messaggio appena creato e lo invio tramite metodo send dell'oggetto remoto
			server.send(m);
		}
		
	}

	@Override
	public void run() {
		
		int lastId=0;
		
		List<Message> lista;
		try {
			while(true){
				//Ricevo la sottolista dei msg non ancora ricevuti a partire dall'id specificato
				lista = server.receive(lastId);
				
				//nome_classe var: struttura_da_iterare
				for(Message m: lista){
					System.out.println(m.getUser()+": "+m.getText());
					lastId = m.getId();
				}
				try {
					//Prima di rifare il while faccio attendere per un secondo
					Thread.sleep(SLEEP);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		} catch (RemoteException e) {
			e.printStackTrace();
		} 
		
		
	}
}
